package com.chaoxinet.csmall.passport.web;


import com.chaoxinet.csmall.passport.exception.ServiceException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * 用于封装服务器端向客户端响应结果的类型
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Data
public class JsonResult<T> implements Serializable {
    /**
     * 操作结果的状态码
     */
    @ApiModelProperty("业务状态码")
    private Integer state;
    // 将该标记放在属性上，如果该属性为NULL则不显示,不为NULL不显示
    // @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("错误信息")
    private String message;
    /**
     * 操作成功时响应的数据
     */
    @ApiModelProperty("数据")
    private T data;

    public static final int OK = 1;

    /**
     * 生成一个表示操作成功的JsonResult对象
     *
     * @return 返回一个表示操作成功的JsonResult对象
     */
    public static JsonResult ok() {
        return ok(null);
    }

    /**
     * 生成一个表示操作成功的JsonResult对象，并设置数据,需要设计为泛型
     *
     * @param data 要设置的数据
     * @return 返回一个表示操作成功的JsonResult对象，并包含指定的数据
     */
    public static<T> JsonResult<T> ok(T data) {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setState(ServiceCode.OK.getValue());
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 表示操作失败的状态码
     */
    public static final int ERR = 1;

    /**
     * 生成一个表示操作失败的JsonResult对象
     *
     * @param state   表示失败状态的ServiceCode对象
     * @param message 失败的消息
     * @return 返回一个表示操作失败的JsonResult对象
     */
    public static JsonResult fail(ServiceCode state, String message) {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setState(state.getValue());
        jsonResult.setMessage(message);
        return jsonResult;
    }

    /**
     * 生成一个表示操作失败的JsonResult对象，根据ServiceException对象设置状态码和消息
     *
     * @param e ServiceCode对象
     * @return 返回一个表示操作失败的JsonResult对象
     */
    public static JsonResult fail(ServiceException e) {
        return fail(e.getServiceCode(), e.getMessage());
    }
}